package com.prj.ufdm.demo.tutorial.thread;

import java.util.Random;
import java.util.concurrent.CyclicBarrier;
/**
 * CyclicBarrier 
 * 让一组线程到达一个屏障,一个集合点时,被阻塞,直到所有的线程都到了这个集合点时,屏障才会打开,然后线程才能继续往下执行.
 * 举个简单的例子就是:旅游团带着一帮人参观景点,规定在下一个景点A处集合,于是导游就在景点A等着大家,导游就是这个集合点或者说屏障,直到所有的游客集合完毕,导游才会带着大家继续参观下一个景点B
 * 与CountDownLatch不同的是该barrier在释放等待线程后可以重用，所以称它为循环（Cyclic）的屏障（Barrier）
 * @author Administrator
 *
 */
public class TestCyclicBarrier {

	public static void main(String[] args) {
		
		
		CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
		
		for(int i=0;i<10;i++) {
			new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						long sleepTime = new Random().nextInt(5000);
						System.out.println("去A景点："+Thread.currentThread().getName()+"过来,耗时："+sleepTime);
						Thread.sleep(sleepTime);
						cyclicBarrier.await();
						System.out.println("10个人到齐，去景点A");
						
						sleepTime = new Random().nextInt(5000);
						System.out.println("去B景点："+Thread.currentThread().getName()+"过来,耗时："+sleepTime);
						Thread.sleep(sleepTime);
						cyclicBarrier.await();
						System.out.println("10个人到齐，去景点B");
						
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}).start();
		}

	}

}
